package ar.edu.frba.utn.dds.Vuelo;

import java.util.ArrayList;
import java.util.List;

import ar.edu.frba.utn.dds.Compania.Compania;
import ar.edu.frba.utn.dds.Expcetion.ConversionException;
import ar.edu.frba.utn.dds.Fecha.Fecha;
import ar.edu.frba.utn.dds.Usuario.Usuario;

public class ObtenerAsientos {

	List<Compania> companias = null;
	List<Asiento> asientosDisponibles = new ArrayList<Asiento>();
	Boolean condicionBusquedaAsiento = false;

	public List<Compania> getCompanias() {
		return companias;
	}

	public void setCompanias(List<Compania> companias) {
		this.companias = companias;
	}

	public List<Asiento> getAsientosDisponibles() {
		return asientosDisponibles;
	}

	public void setAsientosDisponibles(List<Asiento> asientosDisponibles) {
		this.asientosDisponibles = asientosDisponibles;
	}

	public Boolean getCondicionBusquedaAsiento() {
		return condicionBusquedaAsiento;
	}

	public void setCondicionBusquedaAsiento(Boolean condicionBusquedaAsiento) {
		this.condicionBusquedaAsiento = condicionBusquedaAsiento;
	}
	
	/**
	 * Metodo que se encarga de realizar el filtrado de los asientos que cumplen las condiciones
	 * @param viaje
	 * @param user
	 * @return
	 * @throws ConversionException 
	 */
	public List<Asiento> obtenerAsientos(Viaje viaje, Usuario user) throws ConversionException {
		if (this.condicionBusquedaAsiento){
			Companias companias = new Companias();
			companias.agregarTodasLasCompanias();
			this.companias = companias.getCompanias();
		}
		for (Compania companiasDisponibles : this.getCompanias()) {
			String[][] listadoAsientos = companiasDisponibles
					.asientosDisponibles(viaje.getOrigen(), viaje.getDestino(),
							viaje.getFechaSalida(), viaje.getHoraSalida(),
							viaje.getFechaLlegada(), viaje.getHoraLlegada());
			this.asientosDisponibles.addAll(this.convertirAsientos(
					listadoAsientos, viaje,companiasDisponibles, user));
		}
		return asientosDisponibles;
	}
	
	/**
	 * Metodo que se encarga de convertir la matriz de asientos en un lista de asientos
	 * @param listadoAsientos
	 * @param companiaAerea
	 * @param user
	 * @return
	 * @throws ConversionException 
	 */
	private List<Asiento> convertirAsientos(String[][] listadoAsientos,Viaje viaje,
			Compania companiaAerea, Usuario user) throws ConversionException {
		List<Asiento> listaAsientos = new ArrayList<Asiento>();
		for (Integer contadorAsientos=0;contadorAsientos<listadoAsientos.length;contadorAsientos++) {
			String[] strings = listadoAsientos[contadorAsientos];
			Asiento asiento = new Asiento(strings[0], strings[1], strings[2],
					strings[3], strings[4], strings[5], strings[6], strings[7],
					strings[8], strings[9], strings[10],contadorAsientos, companiaAerea, user);
			if (this.requisitoVistaAsiento(asiento, user) && this.cumpleCondicionesDeBusqueda(asiento, viaje))
				listaAsientos.add(asiento);
		}

		return listaAsientos;
	}

	/**
	 * Metodo que devuelve una booleana informando si es factible que el usuario vea dicho asiento
	 * @param asiento
	 * @param user
	 * @return
	 */
	private boolean requisitoVistaAsiento(Asiento asiento, Usuario user) {
		
		if (asiento.sosSuperOferta() && user.getPerfil().asientosOfertas()) {
			return true;
		} else if (asiento.sosSuperOferta()
				&& (!user.getPerfil().asientosOfertas())) {
			return false;
		} else
			return true;
	}
	
	/**
	 * Metodo que se encarga de comprobar si el asiento cumple las condiciones de la busqueda
	 * @throws ConversionException 
	 */
	private Boolean cumpleCondicionesDeBusqueda(Asiento asiento, Viaje viaje) throws ConversionException{
		return (
			this.condicionString(viaje.getOrigen(),asiento.getOrigen())
			&& 
			this.condicionString(viaje.getDestino(),asiento.getDestino())
			&&
			this.condicionFechas(viaje.getFechaSalida(),asiento.getFechaSalida())
			&&
			this.condicionString(viaje.getHoraSalida(),asiento.getHoraSalida())
			&&
			this.condicionFechas(viaje.getFechaLlegada(),asiento.getFechaLlegada())
			&&
			this.condicionString(viaje.getHoraLlegada(),asiento.getHoraLlegada()));
	}
	
	/**
	 * Metodo que se encarga de comparar las fechas para ver si iguales
	 * @param fechaSalida
	 * @param fechaSalida2
	 * @return
	 * @throws ConversionException 
	 */
	private boolean condicionFechas(String fechaViaje, String fechaAsiento) throws ConversionException {
		if (fechaViaje==null){
			return true;
		}else{
			try {
				return (new Fecha().sonLaMismaFecha(fechaViaje, fechaAsiento));
			} catch (ConversionException e) {
				throw new ConversionException(e.getError());
			}
		}
	}

	private boolean condicionString(String viaje, String asiento) {
		if (viaje==null || viaje.equalsIgnoreCase(asiento)){
			return true;
		}else{
			return false;
		}
	}
		
			
}
